package com.odontosis.view.paciente.recibo;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.odontosis.entidade.Pagamento;
import com.odontosis.entidade.Recibo;
import com.odontosis.entidade.ReciboDetalhe;
import com.odontosis.entidade.TipoRecibo;
import com.odontosis.entidade.Usuario;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.service.ReciboService;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisAction;

public class AcaoListagemRecibo extends  OdontosisAction<ReciboService> {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormListagemRecibo formulario = (FormListagemRecibo) form;
		if(!StringUtilsOdontosis.isVazia(formulario.getMetodo()))
		{
			if(formulario.getMetodo().equals("imprimir")){
				return onImprimir(mapping, form, request, response);
			}
			if(formulario.getMetodo().equals("deletar")){
				return onDeletar(mapping, form, request, response);
			}
		}
		return onPesquisar(mapping, form, request, response);
	}
	
	public ActionForward onPesquisar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormListagemRecibo formulario = (FormListagemRecibo) form;
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		Date dataInicio = null;
		Date dataFim = null;
		Calendar calendarInicial = Calendar.getInstance();
		if(StringUtilsOdontosis.isDateValid(formulario.getDataInicio())){
			calendarInicial.setTime(formato.parse(formulario.getDataInicio()));
			calendarInicial.set(calendarInicial.get(Calendar.YEAR), calendarInicial.get(Calendar.MONTH), calendarInicial.get(Calendar.DATE), 0 , 0);
			dataInicio = calendarInicial.getTime();
		}

		Calendar calendarFinal = Calendar.getInstance();
		if(StringUtilsOdontosis.isDateValid(formulario.getDataFim())){
			calendarFinal.setTime(formato.parse(formulario.getDataFim()));
			calendarFinal.set(calendarFinal.get(Calendar.YEAR), calendarFinal.get(Calendar.MONTH), calendarFinal.get(Calendar.DATE), 23 , 59);
			dataFim = calendarFinal.getTime();
		}
		
		TipoRecibo tipo = null;
		if(StringUtilsOdontosis.isInteger(formulario.getTipoRecibo())){
			tipo = TipoRecibo.recuperarPorCodigo(Integer.parseInt(formulario.getTipoRecibo()));
		}

		
		Collection<Recibo> recibos = service.pesquisarPorPaciente(formulario.getNomePaciente(), dataInicio, dataFim,tipo);
		request.setAttribute("colecao", recibos);
		return mapping.getInputForward();
	}
	
	public ActionForward onDeletar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormListagemRecibo formulario = (FormListagemRecibo) form;
		Recibo recibo = service.load(Long.parseLong(formulario.getExcluido()));
		
		if(recibo.getListaReciboDetalhe() == null || recibo.getListaReciboDetalhe().isEmpty()) {
			Pagamento pagamento = recibo.getPagamento();
			pagamento.setValor(pagamento.getValor() + recibo.getValor().doubleValue());
			pagamento.setPago(false);
			pagamento.getServico().setPago(false);
			ContainerIoc.getServicoService().update(pagamento.getServico());
			ContainerIoc.getPagamentoService().update(pagamento);
			
		} else {
			
			for(ReciboDetalhe reciboDetalhe : recibo.getListaReciboDetalhe()) {
				Pagamento pagamento = reciboDetalhe.getPagamento();
				pagamento.setValor(pagamento.getValor() + reciboDetalhe.getValor().doubleValue());
				pagamento.setPago(false);
				pagamento.getServico().setPago(false);
				ContainerIoc.getServicoService().update(pagamento.getServico());
				ContainerIoc.getPagamentoService().update(pagamento);
			}
			
		}
		
		Usuario usuarioCancelamento = (Usuario) request.getSession().getAttribute("usuario");
		recibo.setUsuarioCancelamento(usuarioCancelamento);
		recibo.setDataCancelamento(new Date());
		recibo.setJustificativaCancelamento(formulario.getJustificativa());
		service.update(recibo);
		service.excluirLogicamente(recibo);
		
		Collection<String> sucesso = new ArrayList<String>();
		sucesso.add("Recibo Cancelado");
		request.setAttribute("sucesso", sucesso);
		request.setAttribute("mensagens", null);
		return onPesquisar(mapping, form, request, response);
	}
	
	public ActionForward onImprimir(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormListagemRecibo formulario = (FormListagemRecibo) form;
		Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
		Recibo reciboAntigo = service.load(Long.parseLong(formulario.getReciboId()));
		reciboAntigo.setValido(false);
		reciboAntigo.setAtivo(false);
		Recibo recibo = new Recibo();
		recibo.setData(reciboAntigo.getData());
		recibo.setAtivo(true);
		recibo.setId(null);
		recibo.setReciboAnulado(reciboAntigo);
		recibo.setPagamento(reciboAntigo.getPagamento());
		recibo.setNumeroCheque(reciboAntigo.getNumeroCheque());
		recibo.setBanco(reciboAntigo.getBanco());
		recibo.setNomeEmitente(reciboAntigo.getNomeEmitente());
		recibo.setValido(true);
		recibo.setComentario(reciboAntigo.getComentario());
		recibo.setFormaPagamento(reciboAntigo.getFormaPagamento());
		recibo.setValor(reciboAntigo.getValor());
		recibo.setTipoRecibo(reciboAntigo.getTipoRecibo());
		recibo.setVersao(reciboAntigo.getVersao() + 1);
		recibo.setUsuario(reciboAntigo.getUsuario());
		recibo.setListaReciboDetalhe(new ArrayList<ReciboDetalhe>());
		for(ReciboDetalhe reciboDetalhe: reciboAntigo.getListaReciboDetalhe()) {
			ReciboDetalhe reDetalhe = new ReciboDetalhe();
			reDetalhe.setAtivo(true);
			reDetalhe.setPagamento(reciboDetalhe.getPagamento());
			reDetalhe.setRecibo(reciboDetalhe.getRecibo());
			reDetalhe.setValor(reciboDetalhe.getValor());
			recibo.getListaReciboDetalhe().add(reciboDetalhe);
		}
		
		service.update(reciboAntigo);
		service.save(recibo);
		
		formulario.setMetodo(null);
		formulario.setReciboId(null);
		AcaoRecibo.imprimirRecibo(request, recibo);
		
//		Collection<String> sucesso = new ArrayList<String>();
//		sucesso.add("Impressão Realizada com Sucesso");
//		request.setAttribute("sucesso", sucesso);
//		request.setAttribute("mensagens", null);
		
		if(ContainerIoc.getParametrosService().buscarTipoImpressao().intValue() == 5) {
			request.getSession().setAttribute("reimpressao", true);
			return mapping.findForward("impressao");
		}
		
		
		return onPesquisar(mapping, form, request, response);
	}
	

}
